
<!DOCTYPE html>
<html lang="en">
    <head>

    <title>寄存器模式 — ILRuntime</title>
    <meta charset="utf-8">
    <meta name="description" content="ILRuntime">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

    
<link rel="stylesheet" href="/ILRuntime/public/css/page.css">


    <script src="/ILRuntime/public/js/vue.js"></script>
    <script src="/ILRuntime/public/js/jquery.js"></script>
    <meta name="generator" content="Hexo 4.2.1"></head>

    <body>
        
            <nav class="nav">
    <div class="border">
        <img src="/ILRuntime/public/images/logo.png" />
        <button class="hiden-in-phone">V2.1.0</button>
        <button id="btn-menu" class="hiden-in-pc">菜单</button>
        <ul class="nav-link hiden-in-phone">
            <!--li>
                <form id="search-form">
                    <input type="text" id="search-query" class="search-query">
                </form>
            </li!-->
            <li><a href="https://github.com/Ourpalm/ILRuntime/releases" target="_blank" rel="noopener" class="nav-link-li">下载项目</a></li>
            <li><a href="/ILRuntime/public/v1/guide/version.html" class="nav-link-li">更新记录</a></li>
            <li><a href="/ILRuntime/public/v1/guide/contribution.html" class="nav-link-li">贡献指南</li>
            <li><a href="https://github.com/Ourpalm/ILRuntimeU3D/" target="_blank" rel="noopener" class="nav-link-li">U3D示例</a></li>
            <li><a href="https://learn.u3d.cn/tutorial/ilruntime" target="_blank" rel="noopener" class="nav-link-li">视频教程</a></li>
            <li><a href="/ILRuntime/public/" class="nav-link-li current">首页</a></li>
        </ul>
    </div>
</nav>

<div id="container" class="container clear">
    <section class="sidebar clearfix">
    <ul>
        
            
            
                <li><h3>基础</h3></li>
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/index.html" class="sidebar-link">介绍</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/version.html" class="sidebar-link">更新记录</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/contribution.html" class="sidebar-link">贡献指南</a></p>
            </li>
        
            
            
            
                <li><h3>教程</h3></li>
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/tutorial.html" class="sidebar-link">从零开始</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/register-vm.html" class="sidebar-link current">寄存器模式</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/delegate.html" class="sidebar-link">ILRuntime中使用委托</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/cross-domain.html" class="sidebar-link">ILRuntime中跨域继承</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/reflection.html" class="sidebar-link">ILRuntime中的反射</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/redirection.html" class="sidebar-link">CLR重定向</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/bind.html" class="sidebar-link">CLR绑定</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/litjson.html" class="sidebar-link">LitJson集成</a></p>
            </li>
        
            
            
            
            
                <li><h3>其他</h3></li>
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/il2cpp.html" class="sidebar-link">IL2CPP打包注意事项</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/performance-optimization.html" class="sidebar-link">ILRuntime的性能优化</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/principle.html" class="sidebar-link">ILRuntime的实现原理</a></p>
            </li>
        
            
            
            
            
            <li>
                <p><a href="/ILRuntime/public/v1/guide/FastQA.html" class="sidebar-link">常见问题解答</a></p>
            </li>
        
    </ul>
</section>
    <article class="clearfix">
    <h2 id="寄存器模式"><a href="#寄存器模式" class="headerlink" title="寄存器模式"></a>寄存器模式</h2><p>寄存器模式是ILRuntime2.0版引入的专用于优化大规模数值计算的执行模式。该模式通过ILRuntime自己的JIT Compiler将原始DLL的MSIL指令集转换成一个自定义的基于寄存器的指令集，再进行解译执行。由于该JIT编译的结果是ILRuntime自己设计的虚拟指令集，并不是真实硬件指令集，因此可以毫无问题的在iOS等平台上执行</p>
<h3 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h3><p>开启寄存器模式，主要有2个途径：</p>
<figure class="highlight csharp"><table><tr><td class="code"><pre><span class="line"><span class="comment">//第一种方式是在AppDomain的构造函数的参数中，指定全局希望使用的JIT模式</span></span><br><span class="line">appdomain = <span class="keyword">new</span> ILRuntime.Runtime.Enviorment.AppDomain(ILRuntimeJITFlags.JITOnDemand);</span><br><span class="line"></span><br><span class="line"><span class="comment">//第二种方式为在指定的类或者方法上指定用于该类或者方法的JIT模式</span></span><br><span class="line">[<span class="meta">ILRuntimeJIT(ILRuntimeJITFlags.JITImmediately)</span>]</span><br><span class="line"><span class="keyword">class</span> <span class="title">foo</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">ILRuntimeJIT(ILRuntimeJITFlags.NoJIT)</span>]</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">bar</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>    &#123;</span><br><span class="line">        <span class="comment">//该方法的内容将不会开启寄存器模式</span></span><br><span class="line">    &#125;</span><br><span class="line">	</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">bar2</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>    &#123;</span><br><span class="line">        <span class="comment">//该方法的内容将按照所在类指定的模式，也就是立即JIT模式运行</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>ILRuntime的JIT模式有以下几种：</p>
<ul>
<li>JITOnDemand，按需JIT模式，使用该模式在默认的情况下会按照原始的方式运行，当该方法被反复执行时，会被标记为需要被JIT，并在后台线程完成JIT编译后切换到寄存器模式运行</li>
<li>JITImmediately，立即JIT模式，使用该模式时，当方法被调用的瞬间即会被执行JIT编译，在第一次执行时即使用寄存器模式运行。JIT会在当前线程发生，因此如果方法过于复杂在第一次执行时可能会有较大的初始化时间</li>
<li>NoJIT， 禁用JIT模式，该方法在执行时会始终以传统方式执行</li>
<li>ForceInline， 强制内联模式，该模式只对方法的Attribute生效，标注该模式的方法在被调用时将会无视方法体内容大小，强制被内联</li>
</ul>
<h3 id="寄存器模式的性能特点"><a href="#寄存器模式的性能特点" class="headerlink" title="寄存器模式的性能特点"></a>寄存器模式的性能特点</h3><p>当ILRuntime运行在寄存器模式时，主要会有以下性能特征：</p>
<ul>
<li>数值计算性能会大幅提升，包括for循环等需要数值计算的控制流</li>
<li>由于小方法会被内联，所以getter/setter等的调用开销，for循环里调用其他热更内方法的性能也会有所提升</li>
<li>如果一个方法既没有数值计算，又没有频繁调用热更内小方法或者访问property， 主要由调用系统或UnityAPI组成，则不会产生任何优化，一些情况下可能性能还低于传统模式</li>
</ul>
<h3 id="使用建议"><a href="#使用建议" class="headerlink" title="使用建议"></a>使用建议</h3><p>ILRuntime推荐的使用模式有2种：</p>
<ul>
<li>AppDomain构造函数时不指定JIT模式，即默认使用传统模式执行，在遇到就要优化的密集计算型方法时，对该方法指定JITImmediately模式</li>
<li>直接在AppDomain构造函数处指定JITOnDemand模式</li>
</ul>
<p>第一种用法对现有实现影响最小，仅在需要优化处开启，可以比较精准的控制执行效果。如果并不知道在什么时候应该使用何种模式，也可以直接使用JITOnDemand模式，让ILRuntime自行决定运行模式，在大多数情况下是能达到不错的性能平衡的。</p>

    <div class="footer">
        发现错误？想参与编辑？ 
        <a href="https://github.com/Ourpalm/ILRuntime/tree/master/docs/source/src/v1/guide/register-vm.md" target="_blank">
            在 Github 上编辑此页！
        </a>
    </div>
</article>

<div class="sub-nav hiden-in-phone">
    <dl id="sub-nav">
        <dt>本文内容</dt>
        <dd v-for="(ele, index) in sub_nav">
           <a v-bind:href="ele.href">{{ ele.name }}</a>
        </dd>
    </dl>
</div> 
</div>

<footer>
    <div>
        <p>© Copyright 2017 Ourpalm All Rights Reserved</p>
        <p>掌趣科技2017</p>
    </div>
</footer>


<script>
var vm = new Vue({
    el : '#container',
    data: {
        sub_nav : [ ]
    },
    created:function(){
        var obj = [];
        $("article h3").each(function(){
            obj.push({name :  $(this).find("a").attr("title") , href : "#"+$(this).attr("id") });
        });

        this.sub_nav = obj;       
    }
});

var isShow = false;
$("nav").on("click","#btn-menu" , function(){

    if(!isShow){
        
        if($(document).scrollTop() > $(".sidebar").height() - 100){

            $('html, body').animate({scrollTop:0} , 300, "swing",function(){

                $(".sidebar").fadeIn();
                $(".container").animate({"left" : "15rem"}, 500,"swing");
            });
        }else{

                $(".sidebar").fadeIn();
                $(".container").animate({"left" : "15rem"}, 500,"swing");

        }

    }else{
        $(".sidebar").fadeOut();
        $(".container").animate({"left" : "0rem"}, 500,"swing");
    }
    isShow = !isShow;

});

$(".container").on("click" , "article" , function(){

    if(isShow){
        $(".sidebar").fadeOut();
        $(".container").animate({"left" : "0rem"}, 500,"swing");
        isShow = false;    
    }

});
</script>
        
    </body>
</html>